package com.sky.aspect;

import com.sky.annotation.Autofill;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.time.LocalDateTime;

/*
自定义切面类
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    /*
    切入点
     */
    @Pointcut("execution(* com.sky.mapper.*.*(..))&&@annotation(com.sky.annotation.Autofill) ")
    public  void autoFillPointCut(){}
    @Before("autoFillPointCut()")
    public  void autoFill(JoinPoint joinPoint){
        log.info("开始公共字段填充");
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
        Autofill autofill = signature.getMethod().getAnnotation(Autofill.class);
        OperationType operationType = autofill.value();
        Object[] args = joinPoint.getArgs();
        Object arg = args[0];

        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();
if(operationType==OperationType.INSERT){
    //为四个字段赋值
    try {
        Method setCreateTime = arg.getClass().getDeclaredMethod("setCreateTime", LocalDateTime.class);
        Method setCreateUser = arg.getClass().getDeclaredMethod("setCreateUser", Long.class);
        Method setUpdateTime = arg.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
        Method setUpdateUser = arg.getClass().getDeclaredMethod("setUpdateUser", Long.class);

       setCreateTime.invoke(arg,now);
       setCreateUser.invoke(arg,currentId);

    } catch (Exception e) {
        throw new RuntimeException(e);
    }

}
if(operationType==OperationType.UPDATE){

    try {
        Method setUpdateTime = arg.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
        Method setUpdateUser = arg.getClass().getDeclaredMethod("setUpdateUser", Long.class);
        setUpdateTime.invoke(arg,now);
        setUpdateUser.invoke(arg,currentId);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    //为一个字段赋值
}

    }
}
